package fabriques;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import donnees.LigneCommande;

public class FabLigneCommande {

	public static FabLigneCommande fc;

	private static PreparedStatement pcreer;
	private static String creer = "insert into LigneCommande values(?,?,?,?)";
	private static PreparedStatement pIDMax;
	private static String IDMax = "select max(idLigneCommande) from LigneCommande";
	private static PreparedStatement prechercher;
	private static String rechercher = "select * from LigneCommande where idLigneCommande=?";
	private static PreparedStatement prechercherLesLignesDeLaCommande;
	private static String rechercherLesLignesDeLaCommande = "select LigneCommande.* from LigneCommande where idCommande=?";
	private static PreparedStatement prechercherLesLignesDuProduit;
	private static String rechercherLesLignesDuProduit = "select LigneCommande.* from LigneCommande where idProduit=?";
	
	public static synchronized FabLigneCommande getInstance(){
		if(fc == null)
			fc = new FabLigneCommande();
		return fc;
	}

	public static void setConnection(Connection c){
		try {
			pcreer = c.prepareStatement(creer);
			pIDMax = c.prepareStatement(IDMax);
			prechercher = c.prepareStatement(rechercher);
			prechercherLesLignesDeLaCommande = c.prepareStatement(rechercherLesLignesDeLaCommande);
			prechercherLesLignesDuProduit = c.prepareStatement(rechercherLesLignesDuProduit);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private FabLigneCommande(){
		Connexion.getInstance();
		Connection con = Connexion.getCon();
		setConnection(con);
	}

	public LigneCommande creer(int quantite, int idProduit, int idCommande){
		int idPM = 0;
		/* on r�cup�re le dernier id afin de cr�er un nouvel ID coh�rent pour la base. */
		ResultSet res = null;
		try {
			res = pIDMax.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if(res.next())
				idPM = res.getInt(1);
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		idPM++;
		try{
			pcreer.setInt(1,idPM);
			pcreer.setInt(2,quantite);
			pcreer.setInt(3,idProduit);
			pcreer.setInt(4,idCommande);
			pcreer.executeUpdate();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return new LigneCommande(idPM,quantite);
	}
	
	public LigneCommande rechercher(int id) throws SQLException{
		ResultSet res = null;
		try {
			prechercher.setInt(1, id);
			res = prechercher.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return new LigneCommande(res.getInt(1),res.getInt(2));
	}
	
	/*Methode supprimer, � voir s'il faut l'implementer ou non */

	public ArrayList<LigneCommande> rechercherLesLignesDeLaCommande(int id) {
		try{
			prechercherLesLignesDeLaCommande.setInt(1,id);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		ResultSet res = null;
		try{
			res = prechercherLesLignesDeLaCommande.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		ArrayList<LigneCommande> lesLignes = new ArrayList<LigneCommande>();
		try {
			while(res.next()){
				lesLignes.add(new LigneCommande(res.getInt(1), res.getInt(2)));
			}
			return lesLignes;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
		
	}

	public Iterator<LigneCommande> rechercherLesLignesDuProduit(int id) {
		try{
			prechercherLesLignesDuProduit.setInt(1,id);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		ResultSet res = null;
		try{
			res = prechercherLesLignesDuProduit.executeQuery();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		List<LigneCommande> lesLignes = new ArrayList<LigneCommande>();
		try {
			while(res.next()){
				lesLignes.add(new LigneCommande(res.getInt(1), res.getInt(2)));
			}
			return lesLignes.iterator();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	



}
